package cn.tedu.springdemo.day03;

import com.beust.ah.A;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 针对工厂测试类
 */
public class Test01 {
    //传统方法
    @Test
    public void  test01(){
        NetConnection nc=new NetConnection();
        //初始化配置 3个方法
        nc.load();nc.ping();nc.conn();
        //发送数据操作1个方法
        nc.sendData();
    }
    //工厂模式：静态工厂--->静态的工厂类
    @Test
    public void test02(){
        //3个方法的调用过程不考虑--罐头---->不考虑制作过程
        NetConnection nc=NetConStaticFactory.getInstance();
        nc.sendData();
    }
    //工厂模式：实例工厂---->  javaOOP面向对象---> 实例化对象（创建对象）Person p=new Person()
    @Test
    public void test03(){
        //1.创建工厂实例
        NetConInstanceFactory nif=new NetConInstanceFactory();
        //2.创建网络连接对象实例从工厂对象连接实例
        NetConnection nc=new NetConInstanceFactory().getInstance();
        //3.调用其他功能
        nc.sendData();
    }
    /**
     * Spring操作--静态工厂
     * xml配置Bean id class factory-method
     * 返回factory-method的Bean
     */
    @Test
    public void test04(){
        //创建Spring容器
        ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext7.xml");
        //获取bean 强调静态工厂
        NetConnection nc=(NetConnection) ac.getBean("nsf");
        nc.sendData();
        //关闭容器
        ((ClassPathXmlApplicationContext)ac).close();
    }
    /**
     * Spring操作--实例工厂
     * <bean id="NCI" class="cn.tedu.springdemo.day03.NetConInstanceFactory"></bean>
     *  <bean id="nci" class="cn.tedu.springdemo.day03.NetConnection" factory-bean="NCI" factory-method="getInstance"></bean>
     */
    @Test
    public  void test05(){
        ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext7.xml");
        //获取bean 实例工厂？
        NetConnection nc=(NetConnection) ac.getBean("nci");
        nc.sendData();
        ((ClassPathXmlApplicationContext)ac).close();
    }
/**
 * Spring操作--spring工厂（原生）
 * 步骤1.bean(类）实现接口Factory-Bean<类>
 *     xml配置
 **/
@Test
    public void test06(){
    ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext7.xml");
    //spring获取bean Spring工厂 snc
    NetConnection nc=(NetConnection) ac.getBean("snc");
    nc.sendData();
    ((ClassPathXmlApplicationContext)ac).close();
}
/**
 * Spring管理bean使用单例模式：每次都会返回一个对象
 * 优点：减少对象创建，减少内存开销
 *  实际开发，Spring支持多例模式
 **/

 }
